/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Main.java
 *
 * Created on 01-may-2011, 19:18:59
 */
package Window;

import java.awt.Color;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.filechooser.FileView;
import javax.swing.text.Style;

import damas.Procesador;
import Notificaciones.Notificacion;

/**
 *
 * @author Jose
 */
public class Main extends javax.swing.JFrame implements Runnable{
	
	private static String NOMBREAPP ="Juego de damas ";
	
	private Notificacion sistemaNot;
	
	private Procesador pro;
	
	private String nombreFichero;
	
	private Thread hiloProcesador;

    /** Creates new form Main */
    public Main() {
        initComponents();
        consola.setEditable(false);
        
        dibujarTablero(this.piezasTablero);
        //Para que se partan automáticamente las líneas al llegar al final 
        editor.setLineWrap(true);
        // Para que el partido se haga respetando las palabras. Sólo se parte la
        // línea en los espacios entre palabras.
        editor.setWrapStyleWord(true);
        
        
        nombreFichero = new String("");
        
        sistemaNot = new Notificacion();
        
        Thread hiloNotificaciones = new Thread(sistemaNot);
        
        hiloNotificaciones.start();
        
       /* pro = new Procesador();
        
        Thread hiloProcesador = new Thread(pro);
        
        hiloProcesador.start();
        

        while(hiloProcesador.isAlive());
        
        StringTokenizer token = new StringTokenizer(pro.devolverMensajesCompilacion(), "\n");
    	
    	while(token.hasMoreTokens())
    		sistemaNot.anadirMensaje(token.nextToken());*/
        //consola.append(sistemaNot.devolverTodosLosMensajes());//setText(sistemaNot.devolverTodosLosMensajes());
        
    }


	/**
     * Dibuja el tablero con la disposición de piezas indicada por piezasTablero.
     * @param piezasTablero: Indica la posición de las piezas en el tablero.
     */
    private void dibujarTablero(String[][] piezasTablero) {
    	//sistemaNot.anadirMensaje("Dibujando tablero de damas");
    	
    	this.setResizable(false);
        {
            jPanelTablero = new JTablero(piezasTablero);
            jPanel2.add(jPanelTablero);
            pack();
        }
    }

    /**
     * Lee un fichero indicado por nombreFichero y lo muestra en el jTextArea
     * editor.
     * @param nombreFichero: Ruta completa del fichero a abrir.
     */
    private void leerFichero(String nombreFichero) {
        File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;

        try {
            // Apertura del fichero y creacion de BufferedReader para poder
            // hacer una lectura comoda (disponer del metodo readLine()).
            archivo = new File(nombreFichero);
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;
            while ((linea = br.readLine()) != null) {
                editor.append(linea + "\n");
            }
            
            
            /////////////////////// prueba  ejecución del procesador mientrs se carga el fichero 
            //////////////////////////////////////////////////////////////////////////////////////////
                        
           /* sistemaNot = new Notificacion();
            
            Thread hiloNotificaciones = new Thread(sistemaNot);
            
            hiloNotificaciones.start();
            
            //pro = new Procesador("../Damas/src/damas/entrada.txt");
            pro = new Procesador(nombreFichero);
            
            Thread hiloProcesador = new Thread(pro);
            
            hiloProcesador.start();
            

            while(hiloProcesador.isAlive());
            
            StringTokenizer token = new StringTokenizer(pro.devolverMensajesCompilacion(), "\n");
        	
        	while(token.hasMoreTokens())
        		sistemaNot.anadirMensaje(token.nextToken());*/
            //consola.append(sistemaNot.devolverTodosLosMensajes());//setText(sistemaNot.devolverTodosLosMensajes());
            
            ///////////////////////////////////////////////////////////////////////
        	///////////////////////fin de codigo de prueba/////////////////////////////////////////
        	
            
        } catch (Exception e) {
            e.printStackTrace();
            
            sistemaNot.anadirMensaje("Error al leer el fichero de texto");
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
            
            sistemaNot.anadirMensaje("Fichero de texto leído correctamente");
        }
    }

    /**
     * Guarda el contenido del jTextArea en un fichero indicado por nombreFichero.
     * @param nombreFichero: Ruta completa donde guardar el fichero.
     */
    private void guardarFichero(String nombreFichero) {
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(nombreFichero);
            writer.print(editor.getText());
            writer.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            
            sistemaNot.anadirMensaje("Error al guardar el fichero de texto");
        } finally {
            writer.close();
            sistemaNot.anadirMensaje("Fichero de texto guardado correctamente");
        }

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        consola = new javax.swing.JTextArea();
        jPanel2 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        editor = new javax.swing.JTextArea();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenuItem3 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setResizable(false);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Acciones"));

        jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/retrocesoDoble.png"))); // NOI18N
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/retroceso.png"))); // NOI18N

        jButton3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/paro.png"))); // NOI18N

        jButton4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/avance.png"))); // NOI18N
        jButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton4ActionPerformed(evt);
            }
        });

        jButton5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/avanceDoble.png"))); // NOI18N
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButton2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButton3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButton4)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButton5)
                .addContainerGap(367, Short.MAX_VALUE))
        );

        jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jButton1, jButton2, jButton3, jButton4, jButton5});

        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButton5, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton4, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(13, Short.MAX_VALUE))
        );

        jPanel1Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {jButton1, jButton2, jButton3, jButton4, jButton5});

        consola.setColumns(20);
        consola.setRows(5);
        jScrollPane2.setViewportView(consola);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 302, Short.MAX_VALUE)
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 297, Short.MAX_VALUE)
        );

        editor.setColumns(20);
        editor.setRows(5);
        jScrollPane1.setViewportView(editor);

        jMenu1.setText("Archivo");

        jMenuItem1.setText("Abrir");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem1);

        jMenuItem2.setText("Guardar");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem2ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem2);

        jMenuItem3.setText("Salir");
        jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem3ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem3);

        jMenuBar1.add(jMenu1);

        jMenu2.setText("Ayuda");
        jMenuBar1.add(jMenu2);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 362, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 302, Short.MAX_VALUE))))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 178, Short.MAX_VALUE))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 486, Short.MAX_VALUE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Botón "Abrir"
     * @param evt 
     */
    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
    	
    	File file = new File("../");    	
    	
    	//sistemaNot.anadirMensaje("Fichero: " + file.getAbsolutePath());
       
    	javax.swing.JFileChooser dlgAbrir = new javax.swing.JFileChooser(file.getAbsolutePath());
    		
    	
        //Mostrar diálogo abrir.
        int opcion = dlgAbrir.showOpenDialog(this);

		//dlgAbrir.setFileView(fileView );

        //En caso de elegir abrir.
        if (opcion == javax.swing.JFileChooser.APPROVE_OPTION) {
            //Obtener ruta completa y nombre para abrir.
            nombreFichero = dlgAbrir.getSelectedFile().getAbsolutePath();
            leerFichero(nombreFichero);
            
            this.setTitle(NOMBREAPP +"- "+ nombreFichero);
        }
    }//GEN-LAST:event_jMenuItem1ActionPerformed

    /**
     * Botón "Guardar"
     * @param evt 
     */
    private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed
        javax.swing.JFileChooser dlgGuardar = new javax.swing.JFileChooser();
        //Mostrar diálogo guardar.
        int opcion = dlgGuardar.showSaveDialog(this);

        //En caso de elegir abrir.
        if (opcion == javax.swing.JFileChooser.APPROVE_OPTION) {
            //Obtener ruta completa y nombre para abrir.
            String nombreFichero = dlgGuardar.getSelectedFile().getAbsolutePath();
            guardarFichero(nombreFichero);
        }
    }//GEN-LAST:event_jMenuItem2ActionPerformed

    /*
     * Botón "Salir"
     */
    private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed
        System.exit(1);
    }//GEN-LAST:event_jMenuItem3ActionPerformed

    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed
        // TODO add your handling code here:
    	
    	sistemaNot.anadirMensaje("Pulsado boton: PLAY - Procesamiento del codigo");
    	
    	//pro = new Procesador("../Damas/src/damas/entrada.txt");
    	
    	if(!nombreFichero.equals("")){
    		
    		sistemaNot.anadirMensaje("Guardando fichero previamente al procesado.");
    		
    		guardarFichero(nombreFichero);
    		
	        pro = new Procesador(nombreFichero);
	        
	        hiloProcesador = new Thread(pro);
	        
	        hiloProcesador.start();
	        
	
	        while(hiloProcesador.isAlive());
	        
	        StringTokenizer token = new StringTokenizer(pro.devolverMensajesCompilacion(), "\n");
	    	
	    	while(token.hasMoreTokens())
	    		sistemaNot.anadirMensaje(token.nextToken());
	    	

	    	hiloProcesador = null;
	    	
    	}
    	else{
    		sistemaNot.anadirMensaje("No has abierto ningun archivo para procesar.");
    	}
    	
    	
    	
    }

    
    
    
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        // TODO add your handling code here:
    	sistemaNot.anadirMensaje("Pulsado boton: <<");
    }//GEN-LAST:event_jButton1ActionPerformed

    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton5ActionPerformed
        // TODO add your handling code here:
    	sistemaNot.anadirMensaje("Pulsado boton: >>");
    }//GEN-LAST:event_jButton5ActionPerformed

    /**
     * Botón "Abrir"
     * @param evt 
     */
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Main().setVisible(true);
            }
        });*/
    	
    	Main nuevo = new Main();
    	nuevo.setVisible(true);
    	
    	Thread hilo = new Thread(nuevo);
    	
    	hilo.start();
    	
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextArea consola;
    private javax.swing.JTextArea editor;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButton5;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    // End of variables declaration//GEN-END:variables
    private javax.swing.JPanel jPanelTablero;
    // Matriz de piezas de ejemplo
    String[][] piezasTablero = {
        {"", "N", "", "n", "", "n", "", "n"},
        {"n", "", "n", "", "N", "", "n", ""},
        {"", "", "", "N", "", "n", "", "n"},
        {"", "n", "", "", "", "", "N", ""},
        {"", "", "", "", "", "B", "B", ""},
        {"", "b", "", "B", "", "", "", "b"},
        {"b", "", "", "", "b", "", "b", ""},
        {"", "B", "", "b", "", "b", "", "b"},};

	@Override
	public void run() {
		String cad = "";

		while(true){
			if(sistemaNot.numeroMensajesRestantes()>0){
				cad = sistemaNot.obtenerSiguienteMensaje();
				
				if(cad.contains("/!")){	
					consola.append("ERROR: " + cad);
				}
				else{
					consola.append(cad);
				}
			}
		}
		
	}
}
